Ana içeriğe geç
  1. 100 Günde SwiftUI Notları/

5.Gün - Swift Koşullu İfadeler : If , Else If, Switch Case, Ternary Operator

Swift’te bazı koşulları kontrol etmemiz gerekebilir. Koşulun true veya false olmasına göre farklı işlemler yapmak isteyebiliriz. Örneğin;

  • Öğrenci sınav sonucu 80’in üstündeyse ekrana başarı mesajı yazdırmak isteyebiliriz.
  • Bir Array’e veri eklediğimizde 3 ten fazla veri olacaksa, en eskisini silmek isteyebiliriz.

Elbette yukarıdaki durumları arttırabiliriz. Fakat genel mantık bu şekilde.

Swift’te bu koşul durumunu kontrol edebileceğimiz yapılardan biri if yapısıdır.

Swift If Yapısı #

if someCondition {
    print("Do something")
}

Yukarıdaki kodu incelediğimizde;

  • İfade if ile başlar, bu Swift’e bir koşulu kontrol etmek istediğimizi bildirir.
  • someCondition kısmı koşulu yazdığımız yerdir.
  • Eğer koşul doğruysa, terminale “Do something” yazar, yanlışsa hiçbir şey yazmaz.

{ } sembollerinin arasındaki kodlar, Swift’te kod bloğu olarak adalandırılmaktadır. Yukarıdaki kod örneğinde koşul doğruysa çalıştırılacak kodlar kıvırcık parantezlerin arasına yazılmıştır.

let score = 85

if score > 80 {
    print("Great job!")
}

Yukarıdaki kodda koşulumuz score > 80 kısmıdır. Eğer score değişkeninin değeri 80’de büyükse ekrana “Great job!” yazılacaktır. Bizim durumumuzda (score 85 olduğundan) koşulu sağlamış oluruz ve ekrana mesaj yazdırılır.

Karşılaştırma Operatörleri #

Yukarıdaki örnekte > operatörü karşılaştırma operatörü olarak adlandırılmaktadır. Çünkü iki öğeyi karşılaştırır ve neticesinde true veya false döner.

Karşılaştırma operatörlerini inceleyelim;

  • > : Büyük mü?
  • < : Küçük mü?
  • >= : Büyük veya eşit mi?
  • <= : Küçük veya eşit mi?
  • == : Eşit mi?
  • != : Eşit değil mi?
let speed = 88
let percentage = 85
let age = 18
let name = "John"

if speed <= 88 {
    print("Where we're going we don't need roads.")
}

if speed > 88 {
    print("Nothing")
//HERHANGİ BİR ÇIKTI VERMEZ
}

if percentage < 85 {
    print("Sorry, you failed the test.")
//HERHANGİ BİR ÇIKTI VERMEZ
}

if age >= 18 {
    print("You're eligible to vote")
}

if name == "John" {
	print("Greetings John")
}

if name != "" {
	print("There is a name")
}

//ÇIKTILAR:
//Where we're going we don't need roads.
//You're eligible to vote
//Greetings John
//There is a name

Swift bir çok değeri birbiri ile karşılaştırmamıza olanak tanımaktadır. Örneği inceleyelim;

let firstName = "Paul"
let secondName = "Sophie"

let firstAge = 40
let secondAge = 10

Değer atamalarımızı yukarıda yaptık, aşağıda da karşılaştırma işlemini gerçekleştirelim.

print(firstName == secondName) //false
print(firstName != secondName) //true
print(firstName < secondName)  //true
print(firstName >= secondName) //false

print(firstAge == secondAge) //false
print(firstAge != secondAge) //true
print(firstAge < secondAge)  //false
print(firstAge >= secondAge) //true

Arka planda Swift akıllıca davranır ve String ifadeleri harf sırasına göre karşılaştırma yapabilir. Bu sadece String’ler ile sınırlı değildir. Örneğin Swift’te bulunan Date türü verileri de kolaylıkla karşılaştırabiliriz.

Eğer enum tipindeki değerleri karşılaştırmak istiyorsak, enum ifadeye Comparable eklemeliyiz.

enum Sizes: Comparable {
    case small
    case medium
    case large
}

let first = Sizes.small
let second = Sizes.large
print(first < second)

Çıktı true olacaktır, çünkü enum listesinde small , large ‘dan önce gelir.

Çoklu Koşullar Nasıl Kontrol Edilir? #

Çoklu koşulların kontrolü için, else bloğunu kullanırız. else bloğu koşul, true olmadığı durumda çalıştırılacak olan kod bloğudur.

if someCondition {
    print("This will run if the condition is true")
} else {
    print("This will run if the condition is false")
}

ilk durum başarısız olursa, yeni bir kontrol yapmamızı sağlayan else if adında bir yapı daha vardır.

let a = false
let b = true

if a {
    print("Code to run if a is true")
} else if b {
    print("Code to run if a is false but b is true")
} else {
    print("Code to run if both a and b are false")
}

//ÇIKTI: Code to run if a is false but b is true

İstersek daha da fazla else if ekleyebiliriz, fakat ekleme yaptıkça kodumuz da karmaşıklaşmaya başlıyor.

Bazen de birden fazla durumu kontrol etmek isteyebiliriz. Örneğin şöyle bir durumla olabilir; “Bugün hava sıcaklığı 20 santigrat dereceden büyük ve 30 dereceden küçükse ekrana bir mesaj yazdıralım”

let temp = 25

if temp > 20 {
    if temp < 30 {
        print("It's a nice day.")
    }
}

Yukarıdaki kod gayet iyi çalışır, fakat Swift burada bize daha iyi bir alternatif sunuyor : && ve anlamına gelen bu operatör ile, iki adet koşulu birleştirip şu şekilde yazabiliriz.

if temp > 20 && temp < 30 {
    print("It's a nice day.")
}

|| operatörü ise veya anlamına gelmektedir. Örneğin; “Bir kullanıcı en az 18 yaşındaysa veya ebeveyninden izni varsa oyun alabilir” dediğimizi varsayalım. Bunu aşağıdaki gibi kodlayabiliriz.

let userAge = 14
let hasParentalConsent = true

if userAge >= 18 || hasParentalConsent == true {
    print("You can buy the game")
}
//ÇIKTI: You can buy the game

Bir koddaki == true kısmı kaldırılabilir. Bu durumda kod;

if userAge >= 18 || hasParentalConsent {
    print("You can buy the game")
}

Swift Switch Yapısı #

Daha fazla koşulu kontrol etmek için, istediğimiz kadar if ve else if kullanabiliriz. Fakat bu kodumuzun okunabilirliğini önemli ölçüde azaltacaktır. Enum ile oluşturduğumuz hava durumunu kullanarak bir if koşul ifadesi yazsaydık aşağıdaki gibi görünürdü.

enum Weather {
    case sun, rain, wind, snow, unknown
}

let forecast = Weather.sun

if forecast == .sun {
    print("It should be a nice day.")
} else if forecast == .rain {
    print("Pack an umbrella.")
} else if forecast == .wind {
    print("Wear something warm")
} else if forecast == .snow {
    print("School is cancelled.")
} else {
    print("Our forecast generator is broken!")
}

Yukarıdaki kodu daha da sadeleştirerek switch yaspısı ile şu şekilde yazabiliriz.

switch forecast {
case .sun:
    print("It should be a nice day.")
case .rain:
    print("Pack an umbrella.")
case .wind:
    print("Wear something warm")
case .snow:
    print("School is cancelled.")
case .unknown:
    print("Our forecast generator is broken!")
}
  1. switch forecast ile başlıyoruz, bu Swift’e hangi değeri kontrol etmek istediğimizi bildirir.
  2. case deyimi ile devam ediyoruz, burada enum ifademizdeki durumları belirliyoruz.
  3. case ifadelerinin her biri Weather enumunu kontrol ettiği için her defasında Weather.sun vs. yazmamıza gerek yok.
  4. Eşleşen durumdan sonra yapılacakların başlangıcı belirlemek için : kullanıyoruz.
  5. Switch ifadesini bitirmek için kapatma parantezimizi yerleştiriyoruz.

Swift Switch Yapısının Önemli Noktaları #

  1. Switch’te kontrol edilen durumlar kapsayıcı olmak zorundadır, yani olası tüm değerler Switch içinde ele alınmalıdır. Örneğin yukarıdaki Weather enumundaki sun, rain, wind, snow, unknown durumlarının her biri için Switch içerisinde bir case mutlaka oluşturulmalıdır.

    let place = "Metropolis"
    
    switch place {
    case "Gotham":
        print("You're Batman!")
    case "Mega-City One":
        print("You're Judge Dredd!")
    case "Wakanda":
        print("You're Black Panther!")
    default:
        print("Who are you?")
    }
    

    Yukarıdaki gib bir String ifade için switch değerlendirmesi yaptığımızı düşünelim. Bu durumda bütün olası String ifadeleri case olarak yazmam mümkün değildir. İşte bunun için default anahtar kelimesini kullanırız.

    default durumu, öncesindeki hiçbir case in eşleşmemesi durumunda yürütülecek kodları içerir. (Evet default en sonda olmalıdır.)

  2. Swift’te kontrol ettiğimiz koşulla eşleşen ilk durum yürütülür, daha sonraki case ’ler kontrol edilmez.

    Fakat herhangi bir nedenden ötürü diğer case lerin de işletilmesini istiyorsak fallthrough ’u kullanabiliriz.

    let day = 5
    print("My true love gave to me…")
    
    switch day {
    case 5:
        print("5 golden rings")
    case 4:
        print("4 calling birds")
    case 3:
        print("3 French hens")
    case 2:
        print("2 turtle doves")
    default:
        print("A partridge in a pear tree")
    }
    
    //ÇIKTI : My true love gave to me…
    //        5 golden rings
    

    fallthrough kullanarak yeniden yazalım.

    let day = 5
    print("My true love gave to me…")
    
    switch day {
    case 5:
        print("5 golden rings")
        fallthrough
    case 4:
        print("4 calling birds")
        fallthrough
    case 3:
        print("3 French hens")
        fallthrough
    case 2:
        print("2 turtle doves")
        fallthrough
    default:
        print("A partridge in a pear tree")
    }
    
    //ÇIKTI : My true love gave to me…
    //        5 golden rings
    //        4 calling birds
    //        3 French hens
    //        2 turtle doves
    //        A partridge in a pear tree
    

    Neden Switch? #

    1. Switch kontrollerinin kapsamlı olması gerekir. Her olası değer için case bloğuna sahip olmamız (enum’daki tüm durumlar) veya default bir durum belirlememiz gerekir.Bu sebeple bir olasılığı gözden kaçırmamız zorlaşır. if ve else if için böyle bir zorunluluk yoktur.
    2. Bir değeri birden fazla muhtemel sonuç için kontrol ederken, switch kullanırsak bu değer yalnızca bir kez okunurken, if yapısında her defasında değer çağrılır. Bu durum performans sorunlarına neden olabilir.

Ternary Operatörü (?:) #

Bu operatör, 3 parça giriş almaktadır. Ternary Operatörü bir koşulu kontrol etmemizi ve iki değerden birini döndürmemizi sağlar. true ise birini, false ise diğerini.

Örneğin bir kişinin yaşına göre oy kullanıp kullanamayacağını kontrol edelim.

let age = 18
let canVote = age >= 18 ? "Yes" : "No"

Burada canVote değişkenin değeri “Yes” olacaktır. Yukarıdaki örnek aslında bir if else bloğudur. Ama daha kısa yazılmış hali.

Ternary Operatörünün yapısını WTF ile aklınız tutabilirsiniz. (aynı zamanda İngilizcedeki What The Fck* ‘ın kısaltması)

  • What - Koşulumuz Ne? : age≥18
  • True - Koşul doğru ise hangi değer dönecek : “Yes”
  • False - Koşul yanlış ise hangi değer dönecek : “No”

Örnek:

enum Theme {
    case light, dark
}

let theme = Theme.dark

let background = theme == .dark ? "black" : "white"
print(background)

//ÇIKTI : black
  • What : theme == .dark
  • True : “black”
  • False : “white”

Bu yazıyı İngilizce olarak da okuyabilirsiniz.
You can also read this article in English.

Bu yazı, SwiftUI Day 5 adresinde bulunan yazılardan kendim için aldığım notları içermektedir. Orjinal dersi takip etmek için lütfen bağlantıya tıklayın.